broadway: Prepare for implementing diff
authorAlexander Larsson <alexl@redhat.com>
Wed, 29 Nov 2017 19:05:02 +0000 (20:05 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 30 Nov 2017 20:57:42 +0000 (21:57 +0100)
gdk/broadway/broadway-output.c
gdk/broadway/broadway-output.h
gdk/broadway/broadway-server.c

index e679923f370bdabbd09193a2ed3d8b76215e9430..9389de44ce9263301e61c3d15e1bd1dda1193424 100644 (file)
@@ -154,6 +154,19 @@ append_uint32 (BroadwayOutput *output, guint32 v)
   buf[3] = (v >> 24) & 0xff;
 }
 
+static void
+patch_uint32 (BroadwayOutput *output, guint32 v, gsize offset)
+{
+  guint8 *buf;
+
+  buf = (guint8 *)output->buf->str + offset;
+  buf[0] = (v >> 0) & 0xff;
+  buf[1] = (v >> 8) & 0xff;
+  buf[2] = (v >> 16) & 0xff;
+  buf[3] = (v >> 24) & 0xff;
+}
+
+
 static void
 write_header(BroadwayOutput *output, char op)
 {
@@ -309,29 +322,24 @@ append_node (BroadwayOutput *output,
     append_node (output, node->children[i]);
 }
 
-guint32
-get_node_size (BroadwayNode   *node)
-{
-  guint32 size = 1 + node->n_data;
-  guint32 i;
-
-  for (i = 0; i < node->n_children; i++)
-    size += get_node_size (node->children[i]);
-
-  return size;
-}
-
-
 void
 broadway_output_window_set_nodes (BroadwayOutput *output,
                                   int             id,
-                                  BroadwayNode   *root)
+                                  BroadwayNode   *root,
+                                  BroadwayNode   *old_root)
 {
+  gsize size_pos, start, end;
   write_header (output, BROADWAY_OP_SET_NODES);
 
   append_uint16 (output, id);
-  append_uint32 (output, get_node_size (root));
+
+  size_pos = output->buf->len;
+  append_uint32 (output, 0);
+
+  start = output->buf->len;
   append_node (output, root);
+  end = output->buf->len;
+  patch_uint32 (output, (end - start) / 4, size_pos);
 }
 
 void
index db1ba944d88689a9445489c6d09d442c1a897793..4f18b6e882abc880a1172b6bbf4e880c6ddfeecf 100644 (file)
@@ -59,7 +59,8 @@ void            broadway_output_set_transient_for (BroadwayOutput *output,
                                                   int             parent_id);
 void            broadway_output_window_set_nodes (BroadwayOutput *output,
                                                   int             id,
-                                                  BroadwayNode   *root);
+                                                  BroadwayNode   *root,
+                                                  BroadwayNode   *old_root);
 void            broadway_output_upload_texture (BroadwayOutput *output,
                                                guint32 id,
                                                GBytes *texture);
index a6b311415c4260c1135e031b0fd21cd3dce124ae..3cbd214d34b81430866011701c2901458a6396fc 100644 (file)
@@ -1635,13 +1635,13 @@ broadway_server_window_set_nodes (BroadwayServer   *server,
   if (window == NULL)
     return;
 
+  if (server->output != NULL)
+    broadway_output_window_set_nodes (server->output, window->id,
+                                      root, window->nodes);
+
   if (window->nodes)
     broadway_node_free (window->nodes);
   window->nodes = root;
-
-  if (server->output != NULL)
-    broadway_output_window_set_nodes (server->output, window->id,
-                                      window->nodes);
 }
 
 guint32
@@ -1888,7 +1888,7 @@ broadway_server_resync_windows (BroadwayServer *server)
 
       if (window->nodes)
         broadway_output_window_set_nodes (server->output, window->id,
-                                          window->nodes);
+                                          window->nodes, NULL);
 
       if (window->visible)
        broadway_output_show_surface (server->output, window->id);